Fix for LWG Issue 2059: C++0x ambiguity problem with map::erase git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@236950 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/map b/include/map index c8e8fd1..4c79662 100644 --- a/include/map +++ b/include/map
@@ -136,6 +136,7 @@ void insert(initializer_list<value_type> il); iterator erase(const_iterator position); + iterator erase(iterator position); // C++14 size_type erase(const key_type& k); iterator erase(const_iterator first, const_iterator last); void clear() noexcept; @@ -330,6 +331,7 @@ void insert(initializer_list<value_type> il); iterator erase(const_iterator position); + iterator erase(iterator position); // C++14 size_type erase(const key_type& k); iterator erase(const_iterator first, const_iterator last); void clear() noexcept; @@ -1079,6 +1081,8 @@ _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);} _LIBCPP_INLINE_VISIBILITY + iterator erase(iterator __p) {return __tree_.erase(__p.__i_);} + _LIBCPP_INLINE_VISIBILITY size_type erase(const key_type& __k) {return __tree_.__erase_unique(__k);} _LIBCPP_INLINE_VISIBILITY @@ -1811,6 +1815,8 @@ _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __p) {return __tree_.erase(__p.__i_);} _LIBCPP_INLINE_VISIBILITY + iterator erase(iterator __p) {return __tree_.erase(__p.__i_);} + _LIBCPP_INLINE_VISIBILITY size_type erase(const key_type& __k) {return __tree_.__erase_multi(__k);} _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __f, const_iterator __l)
diff --git a/include/set b/include/set index 22d794d..9d64a52 100644 --- a/include/set +++ b/include/set
@@ -116,6 +116,7 @@ void insert(initializer_list<value_type> il); iterator erase(const_iterator position); + iterator erase(iterator position); // C++14 size_type erase(const key_type& k); iterator erase(const_iterator first, const_iterator last); void clear() noexcept; @@ -297,6 +298,7 @@ void insert(initializer_list<value_type> il); iterator erase(const_iterator position); + iterator erase(iterator position); // C++14 size_type erase(const key_type& k); iterator erase(const_iterator first, const_iterator last); void clear() noexcept;
diff --git a/include/unordered_map b/include/unordered_map index 51635de..6cd82f5 100644 --- a/include/unordered_map +++ b/include/unordered_map
@@ -123,6 +123,7 @@ void insert(initializer_list<value_type>); iterator erase(const_iterator position); + iterator erase(iterator position); // C++14 size_type erase(const key_type& k); iterator erase(const_iterator first, const_iterator last); void clear() noexcept; @@ -287,6 +288,7 @@ void insert(initializer_list<value_type>); iterator erase(const_iterator position); + iterator erase(iterator position); // C++14 size_type erase(const key_type& k); iterator erase(const_iterator first, const_iterator last); void clear() noexcept; @@ -944,6 +946,8 @@ _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);} _LIBCPP_INLINE_VISIBILITY + iterator erase(iterator __p) {return __table_.erase(__p.__i_);} + _LIBCPP_INLINE_VISIBILITY size_type erase(const key_type& __k) {return __table_.__erase_unique(__k);} _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __first, const_iterator __last) @@ -1644,6 +1648,8 @@ _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __p) {return __table_.erase(__p.__i_);} _LIBCPP_INLINE_VISIBILITY + iterator erase(iterator __p) {return __table_.erase(__p.__i_);} + _LIBCPP_INLINE_VISIBILITY size_type erase(const key_type& __k) {return __table_.__erase_multi(__k);} _LIBCPP_INLINE_VISIBILITY iterator erase(const_iterator __first, const_iterator __last)
diff --git a/include/unordered_set b/include/unordered_set index d06629f..26ef6fd 100644 --- a/include/unordered_set +++ b/include/unordered_set
@@ -114,6 +114,7 @@ void insert(initializer_list<value_type>); iterator erase(const_iterator position); + iterator erase(iterator position); // C++14 size_type erase(const key_type& k); iterator erase(const_iterator first, const_iterator last); void clear() noexcept; @@ -263,6 +264,7 @@ void insert(initializer_list<value_type>); iterator erase(const_iterator position); + iterator erase(iterator position); // C++14 size_type erase(const key_type& k); iterator erase(const_iterator first, const_iterator last); void clear() noexcept;
diff --git a/test/std/containers/associative/map/map.modifiers/erase_iter.pass.cpp b/test/std/containers/associative/map/map.modifiers/erase_iter.pass.cpp index 05fb988..15c5ce0 100644 --- a/test/std/containers/associative/map/map.modifiers/erase_iter.pass.cpp +++ b/test/std/containers/associative/map/map.modifiers/erase_iter.pass.cpp
@@ -18,6 +18,14 @@ #include "min_allocator.h" +struct TemplateConstructor +{ + template<typename T> + TemplateConstructor (const T&) {} +}; + +bool operator<(const TemplateConstructor&, const TemplateConstructor&) { return false; } + int main() { { @@ -234,4 +242,18 @@ assert(i == m.end()); } #endif +#if __cplusplus >= 201402L + { + // This is LWG #2059 + typedef TemplateConstructor T; + typedef std::map<T, int> C; + typedef C::iterator I; + + C c; + T a{0}; + I it = c.find(a); + if (it != c.end()) + c.erase(it); + } +#endif }
diff --git a/test/std/containers/associative/multimap/multimap.modifiers/erase_iter.pass.cpp b/test/std/containers/associative/multimap/multimap.modifiers/erase_iter.pass.cpp index d91295b..ba55351 100644 --- a/test/std/containers/associative/multimap/multimap.modifiers/erase_iter.pass.cpp +++ b/test/std/containers/associative/multimap/multimap.modifiers/erase_iter.pass.cpp
@@ -18,6 +18,14 @@ #include "min_allocator.h" +struct TemplateConstructor +{ + template<typename T> + TemplateConstructor (const T&) {} +}; + +bool operator<(const TemplateConstructor&, const TemplateConstructor&) { return false; } + int main() { { @@ -276,4 +284,18 @@ assert(i == m.end()); } #endif +#if __cplusplus >= 201402L + { + // This is LWG #2059 + typedef TemplateConstructor T; + typedef std::multimap<T, int> C; + typedef C::iterator I; + + C c; + T a{0}; + I it = c.find(a); + if (it != c.end()) + c.erase(it); + } +#endif }
diff --git a/test/std/containers/associative/multiset/erase_iter.pass.cpp b/test/std/containers/associative/multiset/erase_iter.pass.cpp index b665666..1d41540 100644 --- a/test/std/containers/associative/multiset/erase_iter.pass.cpp +++ b/test/std/containers/associative/multiset/erase_iter.pass.cpp
@@ -18,6 +18,14 @@ #include "min_allocator.h" +struct TemplateConstructor +{ + template<typename T> + TemplateConstructor (const T&) {} +}; + +bool operator<(const TemplateConstructor&, const TemplateConstructor&) { return false; } + int main() { { @@ -178,4 +186,18 @@ assert(i == m.end()); } #endif +#if __cplusplus >= 201402L + { + // This is LWG #2059 + typedef TemplateConstructor T; + typedef std::multiset<T> C; + typedef C::iterator I; + + C c; + T a{0}; + I it = c.find(a); + if (it != c.end()) + c.erase(it); + } +#endif }
diff --git a/test/std/containers/associative/set/erase_iter.pass.cpp b/test/std/containers/associative/set/erase_iter.pass.cpp index 21666c3..36828be 100644 --- a/test/std/containers/associative/set/erase_iter.pass.cpp +++ b/test/std/containers/associative/set/erase_iter.pass.cpp
@@ -18,6 +18,14 @@ #include "min_allocator.h" +struct TemplateConstructor +{ + template<typename T> + TemplateConstructor (const T&) {} +}; + +bool operator<(const TemplateConstructor&, const TemplateConstructor&) { return false; } + int main() { { @@ -178,4 +186,18 @@ assert(i == m.end()); } #endif +#if __cplusplus >= 201402L + { + // This is LWG #2059 + typedef TemplateConstructor T; + typedef std::set<T> C; + typedef C::iterator I; + + C c; + T a{0}; + I it = c.find(a); + if (it != c.end()) + c.erase(it); + } +#endif }
diff --git a/test/std/containers/unord/unord.map/unorder.map.modifiers/erase_const_iter.pass.cpp b/test/std/containers/unord/unord.map/unorder.map.modifiers/erase_const_iter.pass.cpp index 422dbe4..dbb8129 100644 --- a/test/std/containers/unord/unord.map/unorder.map.modifiers/erase_const_iter.pass.cpp +++ b/test/std/containers/unord/unord.map/unorder.map.modifiers/erase_const_iter.pass.cpp
@@ -21,6 +21,15 @@ #include "min_allocator.h" +struct TemplateConstructor +{ + template<typename T> + TemplateConstructor (const T&) {} +}; + +bool operator==(const TemplateConstructor&, const TemplateConstructor&) { return false; } +struct Hash { size_t operator() (const TemplateConstructor &) const { return 0; } }; + int main() { { @@ -66,4 +75,18 @@ assert(c.at(4) == "four"); } #endif +#if __cplusplus >= 201402L + { + // This is LWG #2059 + typedef TemplateConstructor T; + typedef std::unordered_map<T, int, Hash> C; + typedef C::iterator I; + + C m; + T a{0}; + I it = m.find(a); + if (it != m.end()) + m.erase(it); + } +#endif }
diff --git a/test/std/containers/unord/unord.multimap/unord.multimap.modifiers/erase_const_iter.pass.cpp b/test/std/containers/unord/unord.multimap/unord.multimap.modifiers/erase_const_iter.pass.cpp index 25d6a7a..b31a4e5 100644 --- a/test/std/containers/unord/unord.multimap/unord.multimap.modifiers/erase_const_iter.pass.cpp +++ b/test/std/containers/unord/unord.multimap/unord.multimap.modifiers/erase_const_iter.pass.cpp
@@ -21,6 +21,15 @@ #include "min_allocator.h" +struct TemplateConstructor +{ + template<typename T> + TemplateConstructor (const T&) {} +}; + +bool operator==(const TemplateConstructor&, const TemplateConstructor&) { return false; } +struct Hash { size_t operator() (const TemplateConstructor &) const { return 0; } }; + int main() { { @@ -114,4 +123,18 @@ assert(std::distance(c.cbegin(), c.cend()) == c.size()); } #endif +#if __cplusplus >= 201402L + { + // This is LWG #2059 + typedef TemplateConstructor T; + typedef std::unordered_multimap<T, int, Hash> C; + typedef C::iterator I; + + C m; + T a{0}; + I it = m.find(a); + if (it != m.end()) + m.erase(it); + } +#endif }
diff --git a/test/std/containers/unord/unord.multiset/erase_const_iter.pass.cpp b/test/std/containers/unord/unord.multiset/erase_const_iter.pass.cpp index 6a005d3..d3be2b6 100644 --- a/test/std/containers/unord/unord.multiset/erase_const_iter.pass.cpp +++ b/test/std/containers/unord/unord.multiset/erase_const_iter.pass.cpp
@@ -20,6 +20,15 @@ #include "min_allocator.h" +struct TemplateConstructor +{ + template<typename T> + TemplateConstructor (const T&) {} +}; + +bool operator==(const TemplateConstructor&, const TemplateConstructor&) { return false; } +struct Hash { size_t operator() (const TemplateConstructor &) const { return 0; } }; + int main() { { @@ -67,4 +76,18 @@ assert(c.count(4) == 1); } #endif +#if __cplusplus >= 201402L + { + // This is LWG #2059 + typedef TemplateConstructor T; + typedef std::unordered_set<T, Hash> C; + typedef C::iterator I; + + C m; + T a{0}; + I it = m.find(a); + if (it != m.end()) + m.erase(it); + } +#endif }
diff --git a/test/std/containers/unord/unord.set/erase_const_iter.pass.cpp b/test/std/containers/unord/unord.set/erase_const_iter.pass.cpp index 3a9cb58..4110953 100644 --- a/test/std/containers/unord/unord.set/erase_const_iter.pass.cpp +++ b/test/std/containers/unord/unord.set/erase_const_iter.pass.cpp
@@ -20,6 +20,15 @@ #include "min_allocator.h" +struct TemplateConstructor +{ + template<typename T> + TemplateConstructor (const T&) {} +}; + +bool operator==(const TemplateConstructor&, const TemplateConstructor&) { return false; } +struct Hash { size_t operator() (const TemplateConstructor &) const { return 0; } }; + int main() { { @@ -64,4 +73,18 @@ assert(c.count(4) == 1); } #endif +#if __cplusplus >= 201402L + { + // This is LWG #2059 + typedef TemplateConstructor T; + typedef std::unordered_set<T, Hash> C; + typedef C::iterator I; + + C m; + T a{0}; + I it = m.find(a); + if (it != m.end()) + m.erase(it); + } +#endif }